package algorithm;

import java.util.Stack;

/**
 * @author apple
 * 判断左右括号是否成对
 **/

public class ParentheseTest {
    /**
     * 判断括号的类型
     **/
    private static int parentheseType(char c) {
        switch (c) {
            case '{':
                return -1;
            case '(':
                return -2;
            case '[':
                return -3;
            case '}':
                return 1;
            case ')':
                return 2;
            case ']':
                return 3;
            default:
                return 0;
        }
    }


    /**括号是否成对，返回值为boolean**/
    public static boolean adjustParenthese(String s){
        /**字符串为空，返回false**/
        if(s==null || s.length()==0){
            return false;
        }
        /**括号数量**/
        int count =0;
        /**当前字符**/
        char ch;
        /**生成栈**/
        Stack<Integer> stack = new Stack<>();
        /**字符串长度**/
        int len=s.length();
        /**符号转换后的类型**/
        Integer parentheseType = 0;
        for(int i=0;i<len;i++){
            ch=s.charAt(i);
            parentheseType=parentheseType(ch);

            /**是左括号 就加入栈**/
            if(parentheseType<0){
                count++;
                stack.push(parentheseType);
            }else if(parentheseType>0){
                if(stack.empty()){
                    /**当第一个符号是右括号时，而栈为空时，返回false**/
                    return false;
                }else{
                    /**当右括号和栈中的左括号匹配时，将栈中左括号取出**/
                    if(stack.peek()+parentheseType==0){
                        stack.pop();
                    }
                }
            }else{
                /**既不是左括号，也不是右括号，忽略**/
            }
        }
        if(stack.empty()&& count>0){
            /**当栈被清空，并且括号数量大于0，表示括号成对。**/
            return true;
        }
        return false;
    }

    public static void main(String[] args){
        System.out.println(adjustParenthese("e+}(d-2){kki}[]"));
    }
}
